﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Web;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;

namespace BOL
{
    [Serializable]
    public class AlmacenBL
    {
        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<AlmacenIteminfo> getAlmacenListXObra(int idObra)
        {
            return (from a in DbUtil.Db.Almacens
                    where a.idObra == idObra 
                    orderby a.idInternal
                    select new AlmacenIteminfo
                    {
                        descripcion=a.descripcion,
                        direccion=a.direccion,
                        idinternal=a.idInternal,
                        idResponsable=a.idResponsable.Value,
                        responsable=a.Empleado.descripcion
                    }).ToList();


        }

        public int Add(string descripcion,
            int idResponsable,
            string direccion,
            int? idObra,
            int idEmpresa)
        {
            int? idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
            if (!idEmpleadoEmisor.HasValue)
            {
                throw new Exception("Error en Autenticacion del Usuario");
            }
           
           

            Almacen almacen=new Almacen();
            dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString);
            almacen.Add(_db,
                        descripcion,
                        idResponsable,
                        direccion,
                        idObra,
                        idEmpresa,
                        idEmpleadoEmisor.Value);

            return almacen.idInternal;

        }


        public void Update(int idAlmacen,
            string descripcion,
            int idResponsable,
            string direccion,
            int? idObra,
            int idEmpresa)
        {
            int? idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
            if (!idEmpleadoEmisor.HasValue)
            {
                throw new Exception("Error en Autenticacion del Usuario");
            }

            
            dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString);
            Almacen almacen = _db.Almacens.Single(p => p.idInternal == idAlmacen);
            almacen.Update(_db,
                        descripcion,
                        idResponsable,
                        direccion,
                        idObra,
                        idEmpresa,
                        idEmpleadoEmisor.Value);

            

        }


        public void Delete(int idAlmacen)
        {
            dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString);
            
            Almacen almacen = _db.Almacens.Single(p => p.idInternal == idAlmacen);
            var q= from a  in _db.NotaIngresos
                   where  a.idAlmacen==almacen.idInternal
                   select a;

            if (q.Count()>0)
            {
                throw new Exception("Existe Notas de Ingreso en el almacen");
            }
            
            
            _db.Almacens.DeleteOnSubmit(almacen);
            _db.SubmitChanges();

        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<AlmacenListInfo> GetAlmacenList(int idEmpresa)
        {
            var q = (from a in DbUtil.Db.Almacens
                     where a.idEmpresa== idEmpresa
                     select new AlmacenListInfo
                     {
                         descripcion=a.descripcion,
                         direccion=a.direccion,
                         empleadoCre=a.Empleado1.descripcion,
                         fechaCre=a.fechaCre.Value,
                         fechaMod=a.fechaMod.Value,
                         idEmpresa=a.idEmpresa.Value,
                         idInternal=a.idInternal,
                         idObra=a.idObra.Value,
                         idResponsable=a.idResponsable.Value,
                         responsable=a.Empleado.descripcion,
                         usuarioCre=a.usuarioCre.Value,
                         usuarioMod=a.usuarioMod.Value,
                         obra=a.Obra.descripcion,
                     });

            return q.ToList();
        }

        public AlmacenInfo Load(int idAlmacen)
        {
            var q = (from a in DbUtil.Db.Almacens
                     where a.idInternal== idAlmacen
                     select new AlmacenInfo
                     {
                         descripcion = a.descripcion,
                         direccion = a.direccion,
                         empleadoCre = a.Empleado1.descripcion,
                         fechaCre = a.fechaCre.Value,
                         fechaMod = a.fechaMod.Value,
                         idEmpresa = a.idEmpresa.Value,
                         idInternal = a.idInternal,
                         idObra = a.idObra.Value,
                         idResponsable = a.idResponsable.Value,
                         responsable = a.Empleado.descripcion,
                         usuarioCre = a.usuarioCre.Value,
                         usuarioMod = a.usuarioMod.Value,

                     });

            return q.First();
        }

        int _count;
        public int Count(int idEmpresa,
                    int idProyecto, 
                    int startRowIndex, 
                    int maximumRows, 
                    string sortExpression)
        {
            return _count;
        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<AlmacenIteminfo> GeAlmacenList(int idEmpresa,
                                                            int idProyecto, 
                                                            int startRowIndex, 
                                                            int maximumRows, 
                                                            string sortExpression)
        {

            var q = ApplySelect_ListInfo();
           
                q = q.Where(a => 
                    idEmpresa==0?a.idEmpresa!=0:a.idEmpresa==idEmpresa
                    & idProyecto==0?a.idProyecto!=0:a.idProyecto==idProyecto);
                    
            _count = q.Count();
            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows).ToList();

        }

        private IQueryable<AlmacenIteminfo> ApplySelect_ListInfo()
        {
            var q = from a in DbUtil.Db.Almacens
                    select new AlmacenIteminfo
                    {
                         direccion=a.direccion,
                         empresa=a.Obra.Proyecto.Empresa.descripcion,
                         idEmpresa=a.Obra.Proyecto.idEmpresa.Value,
                         idinternal=a.idInternal,
                         idObra=a.idObra.Value,
                         idProyecto=a.Obra.idProyecto.Value,
                            idResponsable=a.idResponsable.Value,
                             obra=a.Obra.descripcion,
                              proyecto=a.Obra.Proyecto.descripcion,
                               responsable=a.Empleado.descripcion ,
                                fechaCre=a.fechaCre.Value  ,
                                descripcion=a.descripcion,

                    };
            return q;
        }
        private IQueryable<AlmacenIteminfo> ApplySort(IQueryable<AlmacenIteminfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "direccion":
                    q = q.OrderBy(b => b.direccion);
                    break;
                case "direccion DESC":
                    q = q.OrderByDescending(b => b.direccion);
                    break;
                case "empresa":
                    q = q.OrderBy(b => b.empresa);
                    break;
                case "empresa DESC":
                    q = q.OrderByDescending(b => b.empresa);
                    break;
                case "obra":
                    q = q.OrderBy(b => b.obra);
                    break;
                case "obra DESC":
                    q = q.OrderByDescending(b => b.obra);
                    break;

                case "proyecto":
                    q = q.OrderBy(b => b.proyecto);
                    break;
                case "proyecto DESC":
                    q = q.OrderByDescending(b => b.proyecto);
                    break;


                case "responsable":
                    q = q.OrderBy(b => b.responsable);
                    break;
                case "responsable DESC":
                    q = q.OrderByDescending(b => b.responsable);
                    break;

                case "descripcion":
                    q = q.OrderBy(b => b.descripcion);
                    break;
                case "descripcion DESC":
                    q = q.OrderByDescending(b => b.descripcion);
                    break;

                default:
                    q = q.OrderByDescending(b => b.fechaCre);
                    break;
            }
            return q;
        }

    }
}
